class Solution:
def largestComponentSize(self, A: List[int]) -> int:
pri = []
for x in range(2, int(max(A)**0.5)+1):
for y in pri:
if x % y == 0:
break
else:
pri.append(x)
factors = collections.defaultdict(list) # compute factors of each 'a'
for a in A:
x = a
for p in pri:
if p*p > x:
break
if x % p == 0:
factors[a].append(p)
while x % p == 0:
x //= p
if x > 1: # a new prime found
factors[a].append(x)
pri.append(x)
pri = list(set(pri))
n = len(pri)
p2i = {p: i for i,p in enumerate(pri)} # prime to index
parent = [i for i in range(n)] # union-find on primes
def find(i):
if i != parent[i]:
parent[i] = find(parent[i])
return parent[i]
def union(i,j):
pi, pj = find(i), find(j)
if pi != pj:
parent[pi] = pj
for a in A:
if factors[a]:
p0 = factors[a][0]
for p in factors[a][1:]: # link two primes if they are factors of 'a'
union(p2i[p0], p2i[p])
count = collections.Counter(find(p2i[factors[a][0]]) for a in A if factors[a]) # each 'a' corresponds to a prime index
return max(count.values())
36. Valid Sudoku | 557. Reverse Words in a String III |
566. Reshape the Matrix | 167. Two Sum II - Input array is sorted |
387. First Unique Character in a String | 383. Ransom Note |
242. Valid Anagram | 141. Linked List Cycle |
21. Merge Two Sorted Lists | 203. Remove Linked List Elements |
733. Flood Fill | 206. Reverse Linked List |
83. Remove Duplicates from Sorted List | 116. Populating Next Right Pointers in Each Node |
145. Binary Tree Postorder Traversal | 94. Binary Tree Inorder Traversal |
101. Symmetric Tree | 77. Combinations |
46. Permutations | 226. Invert Binary Tree |
112. Path Sum | 1556A - A Variety of Operations |
136. Single Number | 169. Majority Element |
119. Pascal's Triangle II | 409. Longest Palindrome |
1574A - Regular Bracket Sequences | 1574B - Combinatorics Homework |
1567A - Domino Disaster | 1593A - Elections |